package com.pkk.blny.web.controller.front;

import com.pkk.blny.model.domain.Comment;
import com.pkk.blny.model.domain.Post;
import com.pkk.blny.model.domain.Tag;
import com.pkk.blny.model.dto.HaloConst;
import com.pkk.blny.model.dto.ListPage;
import com.pkk.blny.model.enums.BlogPropertiesEnum;
import com.pkk.blny.model.enums.CommentStatusEnum;
import com.pkk.blny.model.enums.PostStatusEnum;
import com.pkk.blny.model.enums.PostTypeEnum;
import com.pkk.blny.model.enums.TrueFalseEnum;
import com.pkk.blny.service.CommentService;
import com.pkk.blny.service.PostService;
import com.pkk.blny.utils.CommentUtil;
import com.pkk.blny.web.controller.core.BaseController;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.PageUtil;
import cn.hutool.core.util.StrUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * <pre>
 *     前台文章归档控制器
 * </pre>
 *
 * @author : RYAN0UP
 * @date : 2018/4/26
 */
@Slf4j
@Controller
@RequestMapping(value = "/archives")
public class FrontArchiveController extends BaseController {

  @Autowired
  private PostService postService;

  @Autowired
  private CommentService commentService;

  /**
   * 文章归档
   *
   * @param model model
   * @return 模板路径
   */
  @GetMapping
  public String archives(Model model) {
    return this.archives(model, 1);
  }

  /**
   * 文章归档分页
   *
   * @param model model
   * @param page page 当前页码
   * @return 模板路径/themes/{theme}/archives
   */
  @GetMapping(value = "page/{page}")
  public String archives(Model model,
      @PathVariable(value = "page") Integer page) {

    //所有文章数据，分页，material主题适用
    Sort sort = new Sort(Sort.Direction.DESC, "postDate");
    Pageable pageable = PageRequest.of(page - 1, 5, sort);
    Page<Post> posts = postService
        .findPostByStatus(PostStatusEnum.PUBLISHED.getCode(), PostTypeEnum.POST_TYPE_POST.getDesc(), pageable);
    if (null == posts) {
      return this.renderNotFound();
    }
    model.addAttribute("is_archives", true);
    model.addAttribute("posts", posts);
    return this.render("archives");
  }

  /**
   * 文章归档，根据年月
   *
   * @param model model
   * @param year year 年份
   * @param month month 月份
   * @return 模板路径/themes/{theme}/archives
   */
  @GetMapping(value = "{year}/{month}")
  public String archives(Model model,
      @PathVariable(value = "year") String year,
      @PathVariable(value = "month") String month) {
    Page<Post> posts = postService.findPostByYearAndMonth(year, month, null);
    if (null == posts) {
      return this.renderNotFound();
    }
    model.addAttribute("is_archives", true);
    model.addAttribute("posts", posts);
    return this.render("archives");
  }

  /**
   * 渲染文章详情
   *
   * @param postUrl 文章路径名
   * @param model model
   * @return 模板路径/themes/{theme}/post
   */
  @GetMapping(value = "{postUrl}")
  public String getPost(@PathVariable String postUrl,
      @RequestParam(value = "cp", defaultValue = "1") Integer cp,
      Model model) {
    Post post = postService.findByPostUrl(postUrl, PostTypeEnum.POST_TYPE_POST.getDesc());
    if (null == post || !post.getPostStatus().equals(PostStatusEnum.PUBLISHED.getCode())) {
      return this.renderNotFound();
    }
    //获得当前文章的发布日期
    Date postDate = post.getPostDate();
    //查询当前文章日期之前的所有文章
    List<Post> beforePosts = postService.findByPostDateBefore(postDate);
    //查询当前文章日期之后的所有文章
    List<Post> afterPosts = postService.findByPostDateAfter(postDate);

    if (null != beforePosts && beforePosts.size() > 0) {
      model.addAttribute("beforePost", beforePosts.get(beforePosts.size() - 1));
    }
    if (null != afterPosts && afterPosts.size() > 0) {
      model.addAttribute("afterPost", afterPosts.get(afterPosts.size() - 1));
    }
    List<Comment> comments = null;
    if (StrUtil.equals(HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()),
        TrueFalseEnum.TRUE.getDesc())
        || HaloConst.OPTIONS.get(BlogPropertiesEnum.NEW_COMMENT_NEED_CHECK.getProp()) == null) {
      comments = commentService.findCommentsByPostAndCommentStatus(post, CommentStatusEnum.PUBLISHED.getCode());
    } else {
      comments = commentService.findCommentsByPostAndCommentStatusNot(post, CommentStatusEnum.RECYCLE.getCode());
    }
    //获取文章的标签用作keywords
    List<Tag> tags = post.getTags();
    List<String> tagWords = new ArrayList<>();
    if (tags != null) {
      for (Tag tag : tags) {
        tagWords.add(tag.getTagName());
      }
    }
    //默认显示10条
    Integer size = 10;
    //获取每页评论条数
    if (StrUtil.isNotBlank(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()))) {
      size = Integer.parseInt(HaloConst.OPTIONS.get(BlogPropertiesEnum.INDEX_COMMENTS.getProp()));
    }
    //评论分页
    ListPage<Comment> commentsPage = new ListPage<Comment>(CommentUtil.getComments(comments), cp, size);
    int[] rainbow = PageUtil.rainbow(cp, commentsPage.getTotalPage(), 3);
    model.addAttribute("is_post", true);
    model.addAttribute("post", post);
    model.addAttribute("comments", commentsPage);
    model.addAttribute("commentsCount", comments.size());
    model.addAttribute("rainbow", rainbow);
    model.addAttribute("tagWords", CollUtil.join(tagWords, ","));
    postService.cacheViews(post.getPostId());
    return this.render("post");
  }
}
